
"""testBaseManualWindow

本示例使用手动进行基本窗体的创建与初始化

1. 使用 QMainWindow 提供的 setCentralWidget 进行初始化
2. 对其 centralWidget 进行设置布局与其它布局控件

"""

import os
import sys

# print(sys.path)
# 由于本脚本在 tests 目录，任何情况下将只以此脚本所在目录为根目录
# 如果是使用 python3 运行此脚本，确保在编译器的时候加入当前目录(确保在项目目录下)
sys.path.append(os.path.abspath(".")) 
# 如果是使用 Code Runner 插件运行此脚本，确保在 cd <paths>/test 的时候加入父级目录
sys.path.append(os.path.abspath("..")) 
# 对于 tests/subdir/ 中的内容，应该添加更深一层的父目录
sys.path.append(os.path.abspath("../..")) 
# print(sys.path)

from PyQt5.QtGui import QPixmap, QPainter, QPainterPath, QColor

# 引入由 pyrcc5 编译的 resources.qrc 生成的 resource.py 内容
# 虽然被 IDE 或 Python 语言服务器报告为未使用(unused)，但因为此模块内部资源是自加载
# 此模块在导入时会自动运行 qInitResources() 函数加载二进制资源(反正是自动的)
import project.resources
from project.base import *

# MainWindow 一个来自 mainwindow.ui 的
from ui_mainwindow import Ui_MainWindow

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        
        self.setCentralWidget(QWidget())
        self.label = QLabel("手动创建测试")
        
        vbox = QVBoxLayout(self.centralWidget())
        vbox.addWidget(self.label, 0, Qt.AlignmentFlag.AlignCenter)
        
        self.button = QPushButton('夜间测试', self)
        self.button.clicked.connect(self.toggleNightMode)
        
        # self.label.setText("手动创建测试")
        # self.ui.label.setPixmap(QPixmap(":/assets/spark.png"))
        self.setWindowTitle("测试 手动创建 窗口")
        self.resize(440,312)
        
        # 从父控件几何中计算 widget 应该移动的中间位置
        baseQt.moveWidgetCenterInWidget(self.button, self)
        self.button.move(self.button.geometry().topLeft() + QPoint(0, 25))
        
        # 
        self.radius = 0
        self.timer = QTimer()
        self.timer.setInterval(6)
        self.timer.timeout.connect(self.updateRadius)
        
        # 
        self.label_path = QPainterPath()
        self.label_path.addRect(QRectF(self.label.geometry()))
        
    def toggleNightMode(self):
        if self.timer.isActive():
            self.timer.stop()
            self.radius = 0
        else:
            self.timer.start()

    def updateRadius(self):
        self.radius += 10
        if self.radius >= 3000:
            self.timer.stop()
            self.radius = 3000
        self.update()

    def paintEvent(self, event):

        # 准备画板 - 抗锯齿 - 不透明
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setOpacity(1)

        # 从按钮开始画 - 以本控件的中心为起点
        button_rect = self.button.geometry()
        # center_x = button_rect.x() + button_rect.width() / 2
        # center_y = button_rect.y() + button_rect.height() / 2
        center = button_rect.center()
        
        # 新图层路径 - 椭圆
        path = QPainterPath()
        # path.addEllipse(center_x - self.radius, center_y - self.radius, self.radius * 2, self.radius * 2)
        path.addEllipse(center, self.radius, self.radius)
        self.label_path = self.label_path.subtracted(path)

        # 画路径 - 0.8倍透明 - 画白色
        painter.fillPath(path, QColor(0, 0, 0))
        painter.setOpacity(0.8)
        # painter.fillPath(self.label_path, QColor(Qt.white))

        painter.end()

# 一个动画居中窗口
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    moveWidgetCenterInDesktopWidget(window)
    sys.exit(app.exec_())
